Skip to content

feat: En 206 move provider platforms - #1284

Merged
CK-7vn merged 18 commits into
mainfrom
EN-206-move-provider-platforms
Nov 5, 2026
Merged

CK-7vn merged 18 commits into
mainfrom
EN-206-move-provider-platforms

Conversation

@CK-7vn

@CK-7vn CK-7vn commented Nov 3, 2026 •

Copy link
Copy Markdown
Member

Pre-Submission PR Checklist

  • No debug/console/fmt.Println statements
  • Unnecessary development comments removed
  • All acceptance criteria verified
  • Functions according to ticket specifications
  • Tested manually where applicable
  • Branch up to date with latest main (main merged in after EN-205 and EN-257)
  • No business logic exists within the database layer
  • DB migrations (if any) are backward-compatible and online-safe — see Database Migrations in CONTRIBUTING.md

Description of the change

Core stops running the Provider Platforms module and talks to the new unlocked-provider-platforms service instead.

  • Core stays the public edge. The module's 30 /api routes go through the same session, role, feature and user checks they had in core, from the contracts' providerplatforms.Routes table. Core then forwards them to the service with Authorization: Bearer <PROVIDER_PLATFORMS_TOKEN> and the caller's claims header. It removes the browser's cookie and any claims header the browser sent. Ingress doesn't change.

  • registry.ProviderPlatforms is now the contracts HTTP client, so Programs, the dashboard and the user routes ask the service. Learning Record is unchanged.

  • Core serves /internal/v1/core/ (coreapi) for the service's calls back to core: users (get, create a student, create login, delete) and Programs' live providers. It's guarded by the same token.

  • User delete no longer writes Provider Platforms' tables in core's transaction. DeleteUser adds a row to the new public.provider_mapping_deletions table (migration 00080) in that same transaction. A scheduler job in tasks runs every minute: it lists the queue (database.QueuedMappingDeletions), asks the service to unlink each user, and dequeues the ones it unlinked (database.DequeueMappingDeletion). A user the service can't unlink yet stays queued until the next run.

  • Removed from core: the module, its api package, its integration tests and goldens (they moved to the service, where 54 of them pass byte-identical), its depguard rule, and the seeder's provider-platform and learning data. Also dropped: dependencies only the module used (oauth2, bluemonday, gocsv, strutil).

  • Programs' integration tests run against a fake Provider Platforms service.

  • Token and URL match Open Content: the server and scheduler read PROVIDER_PLATFORMS_TOKEN and PROVIDER_PLATFORMS_URL. The URL defaults to http://provider-platforms:8080, and both refuse to start without the token, outside tests.

  • Compose and make, like Open Content: an x-provider-platforms anchor builds the service from GitHub (PROVIDER_PLATFORMS_REF, default main), or from your checkout with PROVIDER_PLATFORMS_DIR. It runs as providerplatforms-migrate (after server-migrate), providerplatforms on host port 8083 (Open Content has 8082) and providerplatforms-worker. make migrate, make migrate-fresh and make seed run the service's migrate, migrate-reset and seed-dev, so make seed adds the local Canvas again.

  • Migration renumbered to 00080: main's EN-257 took 00079.

  • Related issues: https://unlockedlabs.atlassian.net/browse/EN-206

Merge order (nothing enforces it):

  1. unlocked-contracts#7: merged and tagged v0.4.0, and pinned here and in unlocked-provider-platforms#1.
  2. unlocked-provider-platforms#1, with its image in ECR.
  3. unlocked-platform#20, which turns staging on: components.providerPlatforms: true and the service's sha- image in sites/staging.yaml.
  4. This PR, right after chore(style): add pint for code style and do first run #20 deploys to staging.

Staging steps:

  1. Before chore(style): add pint for code style and do first run #20 merges, PROVIDER_PLATFORMS_TOKEN is in staging's core-secrets.
  2. Merge chore(style): add pint for code style and do first run #20. Staging then runs the service next to the current core, and both schedulers publish the LMS jobs until step 3, so keep the gap short.
  3. Merge this PR. EN-184's bot pins its sha- image on staging, and the old providerplatforms-worker is already gone, because chore(style): add pint for code style and do first run #20 doesn't render it once the component is on.
  4. On staging, check LMS sign-in, a Canvas sync (it runs once), and that deleting a user unlinks their provider accounts within a minute.

go.mod pins contracts v0.4.0.

@CK-7vn
CK-7vn requested a review from a team as a code owner November 3, 2026 21:16
@CK-7vn
CK-7vn requested review from carddev81 and removed request for a team November 3, 2026 21:16
@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 135 files, which is 35 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: baca2daf-cde6-4a68-a978-0c30e2145432
Commits

Reviewing files that changed from the base of the PR and between 89613fa and d747414.

Files ignored due to path filters: 3

  • backend/go.sum is excluded by !**/*.sum
  • backend/migrations/go.sum is excluded by !**/*.sum
  • backend/seeder/go.sum is excluded by !**/*.sum
Files selected for processing: 135

  • .env.example
  • Makefile
  • README.md
  • backend/.golangci.yml
  • backend/cmd/main.go
  • backend/go.mod
  • backend/migrations/00080_provider_mapping_deletions.sql
  • backend/migrations/go.mod
  • backend/seeder/go.mod
  • backend/seeder/main.go
  • backend/src/database/DB.go
  • backend/src/database/mapping_deletions.go
  • backend/src/database/mapping_deletions_test.go
  • backend/src/database/seed_demo.go
  • backend/src/database/users.go
  • backend/src/handlers/internal_features.go
  • backend/src/handlers/modules.go
  • backend/src/handlers/modules_test.go
  • backend/src/handlers/providerplatforms_proxy.go
  • backend/src/handlers/providerplatforms_proxy_test.go
  • backend/src/handlers/server.go
  • backend/src/handlers/user_handler.go
  • backend/src/models/dashboard.go
  • backend/src/models/provider_mapping_deletion.go
  • backend/src/modules/learningrecord/README.md
  • backend/src/modules/module/module.go
  • backend/src/modules/programs/README.md
  • backend/src/modules/programs/canvas_programs.go
  • backend/src/modules/programs/canvas_programs_test.go
  • backend/src/modules/programs/essential_ed_programs.go
  • backend/src/modules/programs/essential_ed_programs_test.go
  • backend/src/modules/programs/live_provider.go
  • backend/src/modules/programs/module.go
  • backend/src/modules/programs/users_handler.go
  • backend/src/modules/providerplatforms/README.md
  • backend/src/modules/providerplatforms/accounts.go
  • backend/src/modules/providerplatforms/api.go
  • backend/src/modules/providerplatforms/api/api.go
  • backend/src/modules/providerplatforms/api_test.go
  • backend/src/modules/providerplatforms/brightspace.go
  • backend/src/modules/providerplatforms/brightspace_data.go
  • backend/src/modules/providerplatforms/brightspace_test.go
  • backend/src/modules/providerplatforms/canvas.go
  • backend/src/modules/providerplatforms/canvas_test.go
  • backend/src/modules/providerplatforms/handlers.go
  • backend/src/modules/providerplatforms/http.go
  • backend/src/modules/providerplatforms/http_test.go
  • backend/src/modules/providerplatforms/jobs.go
  • backend/src/modules/providerplatforms/jobs_helpers_test.go
  • backend/src/modules/providerplatforms/jobs_test.go
  • backend/src/modules/providerplatforms/kolibri.go
  • backend/src/modules/providerplatforms/kolibri_data.go
  • backend/src/modules/providerplatforms/kolibri_test.go
  • backend/src/modules/providerplatforms/matching.go
  • backend/src/modules/providerplatforms/matching_test.go
  • backend/src/modules/providerplatforms/migrations/00001_move_into_provider_schema.sql
  • backend/src/modules/providerplatforms/migrations/README.md
  • backend/src/modules/providerplatforms/models.go
  • backend/src/modules/providerplatforms/module.go
  • backend/src/modules/providerplatforms/providerservice.go
  • backend/src/modules/providerplatforms/store.go
  • backend/src/modules/providerplatforms/users.go
  • backend/src/modules/providerplatforms/users_test.go
  • backend/src/modules/providerplatforms/worker.go
  • backend/src/modules/providerplatforms/worker_test.go
  • backend/src/modules/providerplatforms/worker_users_test.go
  • backend/src/modules/registry/registry.go
  • backend/src/modules/registry/registry_test.go
  • backend/src/tasks/tasks.go
  • backend/src/tasks/tasks_test.go
  • backend/tests/integration/programs_routes_test.go
  • backend/tests/integration/provider_platforms_fake.go
  • backend/tests/integration/provider_platforms_routes_test.go
  • backend/tests/integration/testdata/provider_platforms/action_apply_matches.golden
  • backend/tests/integration/testdata/provider_platforms/action_apply_matches_other_facility.golden
  • backend/tests/integration/testdata/provider_platforms/action_get_users.golden
  • backend/tests/integration/testdata/provider_platforms/action_get_users_bad_id.golden
  • backend/tests/integration/testdata/provider_platforms/action_get_users_search.golden
  • backend/tests/integration/testdata/provider_platforms/action_import_users.golden
  • backend/tests/integration/testdata/provider_platforms/action_match_users.golden
  • backend/tests/integration/testdata/provider_platforms/catalog.golden
  • backend/tests/integration/testdata/provider_platforms/catalog_search.golden
  • backend/tests/integration/testdata/provider_platforms/course_activity.golden
  • backend/tests/integration/testdata/provider_platforms/course_by_id.golden
  • backend/tests/integration/testdata/provider_platforms/course_by_id_bad_id.golden
  • backend/tests/integration/testdata/provider_platforms/courses.golden
  • backend/tests/integration/testdata/provider_platforms/courses_search.golden
  • backend/tests/integration/testdata/provider_platforms/create_user_account.golden
  • backend/tests/integration/testdata/provider_platforms/daily_activity.golden
  • backend/tests/integration/testdata/provider_platforms/daily_activity_bad_date.golden
  • backend/tests/integration/testdata/provider_platforms/login_create.golden
  • backend/tests/integration/testdata/provider_platforms/login_delete.golden
  • backend/tests/integration/testdata/provider_platforms/logins.golden
  • backend/tests/integration/testdata/provider_platforms/logins_after_create.golden
  • backend/tests/integration/testdata/provider_platforms/logins_after_delete.golden
  • backend/tests/integration/testdata/provider_platforms/logins_after_user_delete.golden
  • backend/tests/integration/testdata/provider_platforms/map_user.golden
  • backend/tests/integration/testdata/provider_platforms/map_user_bad_body.golden
  • backend/tests/integration/testdata/provider_platforms/mapped_users.golden
  • backend/tests/integration/testdata/provider_platforms/mapped_users_after_actions.golden
  • backend/tests/integration/testdata/provider_platforms/mapped_users_after_core_changes.golden
  • backend/tests/integration/testdata/provider_platforms/oidc_client.golden
  • backend/tests/integration/testdata/provider_platforms/oidc_clients.golden
  • backend/tests/integration/testdata/provider_platforms/oidc_clients_after_changes.golden
  • backend/tests/integration/testdata/provider_platforms/oidc_recreate.golden
  • backend/tests/integration/testdata/provider_platforms/oidc_recreate_bad_id.golden
  • backend/tests/integration/testdata/provider_platforms/oidc_register.golden
  • backend/tests/integration/testdata/provider_platforms/oidc_register_again.golden
  • backend/tests/integration/testdata/provider_platforms/outcomes.golden
  • backend/tests/integration/testdata/provider_platforms/outcomes_by_type.golden
  • backend/tests/integration/testdata/provider_platforms/platform_by_id.golden
  • backend/tests/integration/testdata/provider_platforms/platform_by_id_bad_id.golden
  • backend/tests/integration/testdata/provider_platforms/platform_by_id_missing.golden
  • backend/tests/integration/testdata/provider_platforms/platform_callback_no_state.golden
  • backend/tests/integration/testdata/provider_platforms/platform_create.golden
  • backend/tests/integration/testdata/provider_platforms/platform_create_brightspace.golden
  • backend/tests/integration/testdata/provider_platforms/platform_create_http.golden
  • backend/tests/integration/testdata/provider_platforms/platform_delete.golden
  • backend/tests/integration/testdata/provider_platforms/platform_refresh.golden
  • backend/tests/integration/testdata/provider_platforms/platform_update.golden
  • backend/tests/integration/testdata/provider_platforms/platform_update_http.golden
  • backend/tests/integration/testdata/provider_platforms/platforms.golden
  • backend/tests/integration/testdata/provider_platforms/platforms_after_changes.golden
  • backend/tests/integration/testdata/provider_platforms/platforms_oidc_enabled.golden
  • backend/tests/integration/testdata/provider_platforms/platforms_oidc_enabled_after_changes.golden
  • backend/tests/integration/testdata/provider_platforms/user_account.golden
  • backend/tests/integration/testdata/provider_platforms/user_courses.golden
  • backend/tests/integration/testdata/provider_platforms/user_create_with_provider.golden
  • backend/tests/integration/testdata/provider_platforms/user_delete.golden
  • backend/tests/integration/testdata/provider_platforms/users_import.golden
  • backend/tests/integration/testdata/provider_platforms/users_import_bad_body.golden
  • backend/tests/integration/testdata/provider_platforms/users_only_unmapped.golden
  • backend/tests/integration/testenv.go
  • config/docker-compose.kolibri.yml
  • docker-compose.yml

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@github-actions github-actions Bot added documentation Improvements or additions to documentation Backend HAS_MIGRATION labels Nov 3, 2026
@CK-7vn CK-7vn changed the title En 206 move provider platforms feat: En 206 move provider platforms Nov 3, 2026

@carddev81 carddev81 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CK-7vn, awesome job! Here is some findings:

  1. Merging this breaks staging.
    Since EN-184, every main build gets pinned on staging. So as soon as this merges, staging runs the new core with components.providerPlatforms still off:
  • providerplatforms-worker runs backend worker providerplatforms on the new image. That module is gone, so findWorker hits log.Fatal and the pod crash-loops.
  • Every Provider Platforms route answers 502, because PROVIDER_PLATFORMS_URL is empty.

The site-file switch in step 5 has to land together with this merge, not afterwards. Please write the exact staging steps in the description. On EN-205, the platform PR turned staging on itself (see my platform #20 review).

  1. Business logic in the database layer.
    DrainMappingDeletions loops over the queue, calls the service, and decides what stays queued. The database package should only read and delete rows; the loop belongs in tasks:
// database
func (db *DB) QueuedMappingDeletions(ctx context.Context) ([]uint, error)
func (db *DB) DequeueMappingDeletion(ctx context.Context, userID uint) error

// tasks.unlinkDeletedUsers: list, call DeleteUserMappings, dequeue on success, log the rest
  1. Token and URL don't match how core handles Open Content.
    For Open Content, core reads OPEN_CONTENT_TOKEN, defaults the URL to http://open-content:8080, and fails to start without the token. Here it's a shared SERVICE_TOKEN with no default URL and no startup check. A missing URL turns every Provider Platforms route into a 502, and a missing token turns every call into a 401, and neither gets logged at startup. Please match Open Content:
  • PROVIDER_PLATFORMS_TOKEN
  • PROVIDER_PLATFORMS_URL defaulting to http://provider-platforms:8080
  • log.Fatal when the token is empty, outside tests
  1. Compose clashes with Open Content.,
  • Ports: open-content (#1281) and providerplatforms both bind host port 8082, and .env.example points both URLs at 127.0.0.1:8082. With both merged, make dev won't start. Use 8083.
  • Build source: follow Open Content's compose setup. It builds from GitHub by default, with a *_DIR / *_REF override (the x-open-content anchor and the Makefile lines). Here, make dev fails unless you have ../unlocked-provider-platforms checked out.
  1. Make targets skip the service.
  • make migrate, make migrate-fresh and make seed don't run the service's migrate or seed. For Open Content they run its migrate, migrate-reset and seed-dev; please do the same here (this needs the seed-dev from my PP #1 review).
  • The make canvas banner still says "edit the seeded Canvas provider platform", and nothing seeds one anymore.
  1. Rebase, and order this against EN-205.
  • This branch is on 4398d866; main is at 9dd57e8c.
  • #1281 (EN-205) touches the same files: registry.go, server.go, docker-compose.yml, .env.example and go.mod. Say in the description which one merges first.
  • Migration 00079 also clashes with my #1282, which adds a 00079 too. Whichever lands second renumbers; if yours goes first, I'll renumber mine.
  1. The ticket can only close once all of this is done:
  • Contracts #7 is merged and tagged v0.4.0, with the pin swapped here and in unlocked-provider-platforms.
  • unlocked-provider-platforms #1 is merged, with its image in ECR. Main needs branch protection; I'll set that.
  • unlocked-platform #20 is merged.
  • Staging has been switched over, and LMS sign-in and a sync have both been checked there.

@carddev81 carddev81 left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops

… the scheduler (EN-206)

Deleting a user no longer writes into Provider Platforms' tables in core's
transaction, since Provider Platforms is becoming its own service. It queues
a row in the same transaction, and a job unlinks the user once Provider
Platforms has done it.
Core stops running the Provider Platforms module and talks to the service
instead.

- The module's 30 /api routes are forwarded to the service after the same
  session, role, feature and user checks, with the service token and the
  caller's claims (providerplatforms.Routes in unlocked-contracts).
- registry.ProviderPlatforms is now the contracts HTTP client, so Programs,
  the dashboard and the user routes ask the service. Learning Record is
  unchanged.
- Core serves /internal/v1/core/ (coreapi) for the service's calls to core's
  users and Programs' live providers.
- The module, its api package, its core integration tests and its depguard
  rule are gone; the seeder no longer seeds provider platforms or learning
  data, which the service's demo seed does.
- The Programs integration tests run against a fake service.
- Needs unlocked-contracts v0.4.0.
…(EN-206)

Compose builds the service from the checkout next to this one, as
providerplatforms, providerplatforms-worker and a one-shot migrate that runs
after core's. The server and scheduler get PROVIDER_PLATFORMS_URL and the
shared SERVICE_TOKEN.
…EN-206)

testenv.go is not a _test file, so go build ./... (CI's every-module build)
failed on startFakeProviderPlatforms, which only existed in a _test file.
…(EN-206)

v0.4.0 is not tagged yet, so no module could resolve it. Pins backend, seeder
and migrations to unlocked-contracts#7's head commit and tidies away the
dependencies only the removed module used. Switch to v0.4.0 once it is tagged.
…he service (EN-206)

Sends the contracts' routes through core's router to a stand-in service: a
user reading another user's data, a facility admin reading another facility's
user, a student on an admin route and a facility without the feature are
refused, and none of those requests reaches the service.
@CK-7vn
CK-7vn force-pushed the EN-206-move-provider-platforms branch from 95f252e to 087fd0e Compare November 4, 2026 18:56
@carddev81
carddev81 self-requested a review November 4, 2026 19:49

@carddev81 carddev81 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CK-7vn thanks for make the changes, there seems to be some of the same issues...so I'm not sure this was ready or not. I seen that you made changes though

  1. DrainMappingDeletions is still business logic in the database layer.
    It's still in database/mapping_deletions.go, looping and calling the service. Split it as I described: QueuedMappingDeletions and DequeueMappingDeletion in database, with the loop in tasks. The "No business logic exists within the database layer" box in the description is ticked, so please untick it until this is moved.

  2. Token and URL still don't match Open Content.
    It's still SERVICE_TOKEN, with no default URL and no startup check (registry.go:42-45). Open Content's version is on main now, so you can copy it: PROVIDER_PLATFORMS_TOKEN, PROVIDER_PLATFORMS_URL defaulting to http://provider-platforms:8080, and log.Fatal when the token is empty, outside tests.

  3. Compose still clashes with Open Content, and now it's on main.

  • providerplatforms still binds host port 8082, which open-content uses on main. Use 8083, here and in .env.example.
  • It still builds only from ../unlocked-provider-platforms. Follow main's x-open-content anchor and its Makefile lines: build from GitHub by default, with a PROVIDER_PLATFORMS_DIR / PROVIDER_PLATFORMS_REF override.
  1. Make targets still skip the service.
    make migrate, make migrate-fresh and make seed still only run core's. Main's Makefile now runs Open Content's migrate, migrate-reset and seed-dev, so add the same for Provider Platforms. The make canvas banner still says "edit the seeded Canvas provider platform".

  2. Rebase onto main again.
    EN-205 (#1281) merged first, and 1.9.0 is out, so main is at 55c9ff0. This branch is on 9dd57e8 and conflicts in 19 files, including registry.go, server.go, handlers/modules.go, module/module.go, docker-compose.yml, .env.example and the three go.mods. Open Content isn't a module in core anymore, so registry.All() and the tests built around it need to follow main.
    Migration 00079 still clashes with my #1282. Whichever lands second renumbers.

…platforms

# Conflicts:
#	.env.example
#	backend/.golangci.yml
#	backend/go.mod
#	backend/go.sum
#	backend/migrations/go.mod
#	backend/migrations/go.sum
#	backend/seeder/go.mod
#	backend/seeder/go.sum
#	backend/src/database/seed_demo.go
#	backend/src/handlers/internal_features.go
#	backend/src/handlers/modules.go
#	backend/src/handlers/modules_test.go
#	backend/src/handlers/server.go
#	backend/src/models/dashboard.go
#	backend/src/modules/module/module.go
#	backend/src/modules/opencontent/README.md
#	backend/src/modules/registry/registry.go
#	backend/src/modules/registry/registry_test.go
#	backend/tests/integration/testenv.go
#	docker-compose.yml

@carddev81 carddev81 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CK-7vn nice, this round got everything from last time. One thing before this merges:

  1. make dev breaks for everyone once this merges. Compose builds Provider Platforms from https://github.com/UnlockedLabs/unlocked-provider-platforms.git by default, but that repo is private. Docker can't clone it without credentials, so make dev fails unless PROVIDER_PLATFORMS_DIR is set. Open Content and contracts are both public, which is why Open Content's build works. The repo needs to be public before this merges (I'll take care of that), and then the "The repo is private for now..." line comes out of the description.

After contracts #7 is tagged, swap the pin from v0.3.2-0.20261105174553-f3516cf56ee0 to v0.4.0.

EN-206 can only close once:

  • contracts #7 is merged and tagged v0.4.0, with the pin swapped here and in unlocked-provider-platforms#1;
  • unlocked-provider-platforms#1 is merged, with its image in ECR, and the repo is public;
  • PROVIDER_PLATFORMS_TOKEN is in staging's core-secrets;
  • unlocked-platform#20 is merged with staging turned on, and this PR is merged right after it deploys;
  • on staging: LMS sign-in and a sync both work, the syncs run once, providerplatforms-worker is gone, and the Learning Record output is unchanged.

@carddev81
carddev81 self-requested a review November 5, 2026 19:40

@carddev81 carddev81 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CK-7vn great job!!

Squash this when you merge. The main merge brought a 40MB backend/migrations/migrations binary into the branch history. f42d49b0 removes it, but a rebase merge would still carry it into main.

Hold the merge until unlocked-platform#20 has deployed to staging, per the merge order in the description.

EN-206 can only close once:

  • unlocked-provider-platforms#1 is merged, with its image in ECR;
  • PROVIDER_PLATFORMS_TOKEN is in staging's core-secrets;
  • unlocked-platform#20 is merged with staging turned on, and this PR is merged right after it deploys;
  • on staging: LMS sign-in and a sync both work, the syncs run once, providerplatforms-worker is gone, and the Learning Record output is unchanged.

@CK-7vn
CK-7vn merged commit c6bf2b1 into main Nov 5, 2026
12 checks passed
@CK-7vn
CK-7vn deleted the EN-206-move-provider-platforms branch November 5, 2026 22:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backend documentation Improvements or additions to documentation HAS_MIGRATION Other-Config

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants